package main

import (
	"fmt"
	"net"
	"os"
)

const (
	serverTCP = "127.0.0.1:10110"
	serverUDP = "127.0.0.1:10111"
	filePath  = "alarm.wav" // 支持 MP3 或 WAV
	useUDP    = true      // 设置为 true 使用 UDP 发送
)

func main() {
	data, err := os.ReadFile(filePath)
	if err != nil {
		panic(fmt.Sprintf("读取文件失败: %v", err))
	}
	// 添加结束符 0x0D0A
	data = append(data, '\r', '\n')

	if useUDP {
		err = sendUDP(data)
	} else {
		err = sendTCP(data)
	}
	if err != nil {
		fmt.Println("发送失败:", err)
	} else {
		fmt.Println("发送成功")
	}
}

func sendTCP(data []byte) error {
	conn, err := net.Dial("tcp", serverTCP)
	if err != nil {
		return fmt.Errorf("连接 TCP 失败: %w", err)
	}
	defer conn.Close()

	n, err := conn.Write(data)
	if err != nil {
		return fmt.Errorf("TCP 写入失败: %w", err)
	}
	fmt.Printf("TCP 写入 %d 字节\n", n)
	return nil
}

func sendUDP(data []byte) error {
	addr, err := net.ResolveUDPAddr("udp", serverUDP)
	if err != nil {
		return fmt.Errorf("UDP 地址解析失败: %w", err)
	}
	conn, err := net.DialUDP("udp", nil, addr)
	if err != nil {
		return fmt.Errorf("连接 UDP 失败: %w", err)
	}
	defer conn.Close()

	// UDP 需要分包处理（大于 MTU 要拆）
	chunkSize := 1024
	for i := 0; i < len(data); i += chunkSize {
		end := i + chunkSize
		if end > len(data) {
			end = len(data)
		}
		n, err := conn.Write(data[i:end])
		if err != nil {
			return fmt.Errorf("UDP 发送失败: %w", err)
		}
		fmt.Printf("UDP 发送 %d 字节\n", n)
	}
	return nil
}
